#pragma once

#include <cmath>

#include "vec4.h"

namespace TG
{
	class vec4;

	class vec3
	{
	public:
		float x, y, z;

		static const vec3 up;
		static const vec3 down;
		static const vec3 left;
		static const vec3 right;
		static const vec3 forward;
		static const vec3 back;

		vec3() : x(0), y(0), z(0) {}

		vec3(float x, float y, float z) :x(x), y(y), z(z) {}

		float magnitude() const;

		vec3& normalize();

		operator vec4();
	};

	vec3 cross(const vec3 &v0, const vec3 &v1);
	float dot(const vec3 &v0, const vec3 &v1);
	vec3 normalize(const vec3 &v0);
	vec3 operator-(const vec3 &v0, const vec3 &v1);
	vec3 operator+(const vec3 &v0, const vec3 &v1);
	vec3 operator*(const vec3 &v0, const vec3 &v1);
	vec3 operator*(const vec3 &v0, float s);
	vec3 operator*(float s, const vec3 &v0);
	vec3 operator/(const vec3 &v0, float &&s);
}